package com.itheima;

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;


import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
    服务端实现的需求：
        1.创建服务端，绑定端口
        2.接收客户端的socket连接，交给一个独立的线程来处理
        3.把当前连接的客户端socket存入到一在线socket集合中保存
        4.接收客户端的消息，然后推送给当前所有在线的socket接收
 */
public class ChatServer {
    // 定义一个静态集合，保存登陆用户的Socket
    public static Map<Socket, User> allSocketOnLine = new HashMap<>();
    //定义一个静态集合，保存注册的用户
    public static Map<String,User> allUsers = new HashMap<>();
    //定义一个静态集合，保存管理员XML文件的用户列表
    public static Map<String,User> admin = new HashMap<>();

    public static void main(String[] args)  {


        try {
            //解析XML的管理员文件并添加到用户列表和管理员列表中
            Document read = new SAXReader().read("chatserver/src/admins.xml");
            List<Node> nameList = read.selectNodes("//users//user[@isAdmin=\"true\"]//userName");
            List<Node> sexList = read.selectNodes("//users//user[@isAdmin=\"true\"]//sex");
            List<Node> ipList = read.selectNodes("//users//user[@isAdmin=\"true\"]//ip");
            List<Node> ageList = read.selectNodes("//users//user[@isAdmin=\"true\"]//age");
            for (int i = 0; i < nameList.size(); i++) {
                String sex = sexList.get(i).getText();
                String name = nameList.get(i).getText();
                String ip = ipList.get(i).getText();
                int age = Integer.parseInt(ageList.get(i).getText());
                User user = new User(name, sex, ip, age);
                allUsers.put(name,user);
                admin.put(name,user);
            }
            //启动服务器
            ServerSocket ss = new ServerSocket(9999);
            System.out.println("服务端已启动!");
            while (true) {
                Socket socket = ss.accept();
                // 为当前登录成功的socket分配一个独立的线程来处理与之通信
                new ChatServerThread(socket).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
